iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
自我挑戰組

C# 從入門到WebApi系列 第 13

[Day13] 論物件導向三本柱之三(多形)

  • 分享至 

  • xImage
  •  

什麼是多形

方法的繼承要能發揮真正的威力,必須仰賴多形
子類別的內容包含了父類別的所有內容
由於越下層的類別一定包含了上層的成員變數
所以我們可以使用上層的類別去指向下層的類別

我會拿昨天的Animal類別來做示範
[Day12] 論物件導向三本柱之二(繼承)

像我可能就懶得看所以我還是再打一次騙騙字數

Animal.cs

using System;

namespace Inheritance
{
    public abstract class Animal
    {
        protected string Name;

        public virtual void Move()
        {
            Console.WriteLine("Move");
        }

        public void GetName()
        {
            Console.WriteLine($"動物的名字是{Name}");
        }

        public abstract void Eat();
    }
}

Dog.cs

using System;

namespace Inheritance
{
    public class Dog : Animal
    {
        public Dog()
        {
            Name = "Dog";
        }

        public void WagTail()
        {
            Console.WriteLine($"{Name}搖了搖尾巴");
        }

        public override void Eat()
        {
            Console.WriteLine($"{Name}吃肉");
        }
    }
}

Bird.cs

using System;

namespace Inheritance
{
    public class Bird:Animal
    {
        public Bird()
        {
            Name = "Bird";
        }

        public override void Move()
        {
            Console.WriteLine("這樣太危險,我飛太遠");
        }

        public override void Eat()
        {
            Console.WriteLine($"{Name}吃蟲");
        }
    }
}

好了 我們現在有一個父類別Animal
還有兩個繼承他的類別Dog與Bird

同樣的我們今天宣告一隻狗跟一隻鳥
但是我們使用父類別Animal來宣告

Animal Dog = new Dog()
Dog.Eat();
//狗吃肉
Animal Bird = new Bird()
Bird.Eat();
//鳥吃蟲

我看不出有那裡厲害的欸

實際上你宣告的一個Animal 類別的物件
但是你所使用的方法屬性等等都是指向子類別的
也就是未來再抽換實作的時候
可以很靈活

讓我們來看得有趣的情況

Animal animal = new Dog();
animal.WagTail();
//出錯

奇怪 狗狗類別明明就有搖尾巴的方法
為甚麼不給我用(怒

因Animal類別沒有啊!!!
你所宣告的物件是Animal
我左看右看都看不見Animal有搖尾巴的方法
因此編譯器會報錯也是理所當然的


上一篇
[Day12] 論物件導向三本柱之二(繼承)
下一篇
[Day14] 論物件導向三本柱之四(依賴反向) 順便介紹介面
系列文
C# 從入門到WebApi30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言